package rai.view;

import java.awt.Button;
import java.awt.List;
import java.awt.Panel;
import java.io.IOException;

import javax.swing.JOptionPane;

import rai.RaiClientListeRepertoires;
import rai.RaiClientRepertoire;
import rai.UtilisateurInconnueException;
import rai.model.Personne;
import rai.service.rep.ListeRepertoires;
import rai.service.rep.Repertoire;

public class IMHListeRepertoires extends IHM {

	// Liste des repertoires
	protected ListeRepertoires lesRepertoires;

	// Champs de l'identifiant du repertoire
	protected java.awt.TextField c_repertoire_identifiant;

	// Les boutons.
	//

	protected java.awt.Button b_repertoire_creer;
	protected java.awt.Button b_repertoire_supprimer;
	protected java.awt.Button b_repertoire_lister;
	protected java.awt.Button b_repertoire_chercher;

	protected List l_repertoires;

	private Button b_repertoire_sauver;

	public IMHListeRepertoires() {
		super();

		// Creation des boutons. La selection de ces boutons
		// est geree par l'objet IHM methode actionPerformed.
		//
		// Panel pour les boutons.
		// Celui-ci est visuellement place a gauche.
		//
		java.awt.Panel pb = new java.awt.Panel();
		pb.setLayout(new java.awt.GridLayout(2, 1));
		add("West", pb);
		zoneBouton(pb);

		// Cette partie contient la fiche Personne.
		// Elle est placee au milieu.
		//
		java.awt.Panel pcr = new java.awt.Panel();
		pcr.setLayout(new java.awt.GridLayout(3, 1));
		add("North", pcr);

		// Creation des labels et du champs de saisies del'identifiant du
		// repertoire
		//
		java.awt.Panel pcr1 = new java.awt.Panel();
		pcr1.setLayout(new java.awt.GridLayout(1, 2));
		pcr.add(pcr1);

		pcr1.add(new java.awt.Label("Identifiant du repertoire :"));
		this.c_repertoire_identifiant = new java.awt.TextField(20);
		pcr1.add(this.c_repertoire_identifiant);

		// Cette partie affiche la liste des repertoires.
		// Elle est placee a droite.
		//
		java.awt.Panel pListe = new java.awt.Panel();
		pListe.setLayout(new java.awt.GridLayout(2, 2));
		add("East", pListe);
		zoneListe(pListe);
	}

	protected void zoneListe(Panel pListe) {
		pListe.add(new java.awt.Label("Liste Repertoires :"));
		this.l_repertoires = new java.awt.List(15);
		this.l_repertoires.addActionListener(this);
		pListe.add(this.l_repertoires);
		pListe.add(new java.awt.Label("Liste Personnes :"));
		super.zoneListe(pListe);
	}

	protected void zoneBouton(Panel pb) {
		java.awt.Panel pbr = new java.awt.Panel();
		pbr.setLayout(new java.awt.GridLayout(6, 1));
		pb.add(pbr);
		pbr.add(new java.awt.Label("Boutons Repertoire :"));
		zoneBoutonListeRepertoires(pbr);
		java.awt.Panel pbp = new java.awt.Panel();
		pbp.setLayout(new java.awt.GridLayout(7, 1));
		pb.add(pbp);
		pbp.add(new java.awt.Label("Boutons Personne :"));
		super.zoneBoutons(pbp);

	}

	private void zoneBoutonListeRepertoires(Panel pbr) {
		this.b_repertoire_creer = new java.awt.Button("Creer un repertoire");
		pbr.add(this.b_repertoire_creer);
		this.b_repertoire_creer.addActionListener(this);

		this.b_repertoire_supprimer = new java.awt.Button(
				"Supprimer un repertoire");
		pbr.add(this.b_repertoire_supprimer);
		this.b_repertoire_supprimer.addActionListener(this);

		this.b_repertoire_chercher = new java.awt.Button(
				"Chercher un repertoire");
		pbr.add(this.b_repertoire_chercher);
		this.b_repertoire_chercher.addActionListener(this);

		this.b_repertoire_lister = new java.awt.Button("Lister les repertoires");
		pbr.add(this.b_repertoire_lister);
		this.b_repertoire_lister.addActionListener(this);
		
		this.b_repertoire_sauver = new java.awt.Button("Sauver les repertoires");
		pbr.add(this.b_repertoire_sauver);
		this.b_repertoire_sauver.addActionListener(this);

	}

	// Gestion de la validation des boutons.
	//
	public void actionPerformed(java.awt.event.ActionEvent e) {
		super.actionPerformed(e);
		Object source = e.getSource();
		if (source == this.l_repertoires)
			chercherRepertoire(l_repertoires.getSelectedItem());
		if (source == this.b_repertoire_creer)
			creerRepertoire(this.c_repertoire_identifiant.getText());
		if (source == this.b_repertoire_supprimer)
			supprimerRepertoire(this.c_repertoire_identifiant.getText());
		if (source == this.b_repertoire_chercher)
			chercherRepertoire(this.c_repertoire_identifiant.getText());
		if (source == this.b_repertoire_lister)
			listerRepertoires();
		if (source == this.b_repertoire_sauver)
			sauverRepertoires();
	}

	private void sauverRepertoires() {
		if (this.lesRepertoires.sauverListeRepertoires())
			fixerErreur(null);
		else
			fixerErreur("Pb E/S : Les repertoires ne sont pas sauvés.");
		
	}

	//
	// Permet de fixer la liste de repertoires courante.
	//
	public void fixerListeRepertoires(ListeRepertoires lesRepertoires)
			throws UtilisateurInconnueException {
		this.lesRepertoires = lesRepertoires;
		if (lesRepertoires != null) {
			String user = JOptionPane.showInputDialog(null,
					"entrez votre nom utilisateur", "CONTROLE UTILISATEUR",
					JOptionPane.WARNING_MESSAGE);
			this.lesRepertoires.authentification(user,"");
			listerRepertoires();
		}
	}

	// Obtenir la reference sur le Repertoire.
	// Si le repertoire n'est pas encore fixe alors fixer l'erreur.
	//
	public ListeRepertoires lesRepertoires() {
		if (this.lesRepertoires == null)
			fixerErreur("Vous n'avez pas fixe la liste de repertoires courante");
		return this.lesRepertoires;
	}

	//
	// Creer et ajouter un objet repertoire a partir de la fiche saisie.
	//
	private void creerRepertoire(String identifiant) {
		System.out.println("IHMListeRepertoires.creerRepertoire(" + identifiant
				+ ")");
		if (this.lesRepertoires.creerRepertoire(identifiant)) {
			this.listerRepertoires();
			this.chercherRepertoire(identifiant);
			this.fixerErreur(null);
		} else
			fixerErreur("Ce carnet d'adresse existe deja");
	}

	private void listerRepertoires() {
		System.out.println("IHMListeRepertoires.listerRepertoires()");
		this.l_repertoires.removeAll();
		for (String identifiant : this.lesRepertoires.listerRepertoires())
			this.l_repertoires.add(identifiant);
		this.fixerErreur(null);
	}

	private void chercherRepertoire(String identifiant) {
		System.out.println("IHMListeRepertoires.chercherRepertoire("
				+ identifiant + ")");

		Repertoire r = this.lesRepertoires.rechercherRepertoire(identifiant);
		if (r == null) {
			fixerErreur("Le repertoire `" + identifiant + "' n'existe pas");
		} else {
			this.fixerRepertoire(r);
			this.c_repertoire_identifiant.setText(identifiant);
			fixerErreur(null);
		}
	}

	private void supprimerRepertoire(String identifiant) {
		System.out.println("IHMListeRepertoires.supprimerRepertoire("
				+ identifiant + ")");
		boolean estsupprime = lesRepertoires.supprimerRepertoire(identifiant);
		listerRepertoires();
		c_repertoire_identifiant.setText("");
		l_personnes.removeAll();
		fixerRepertoire(null);
		if (estsupprime)
			fixerErreur(null);
		else
			fixerErreur("Le repertoire `" + identifiant + "' n'existe pas");
	}

	public static void main(String args[]) throws IOException,
			UtilisateurInconnueException {
		ListeRepertoires lesCarnets = null;
		// Creation d'un repertoire d'adresses.

		lesCarnets = new RaiClientListeRepertoires("localhost");

		// Creer l'IHM.
		IMHListeRepertoires ihm = new IMHListeRepertoires();
		// Lui indiquer le repertoire visualise.
		ihm.fixerListeRepertoires(lesCarnets);

		// Creation d'une fenetre.
		//
		creer_fenetre("Carnet d'adresses", ihm);
	}

}
